iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
Mobile Development

iOS學習資源與筆記系列 第 5

Swift Delegate Pattern 、 C# Delegate

  • 分享至 

  • xImage
  •  

記錄學習內容。
主要是看網路上大大的文章和影片,做些紀錄。
內容可能錯誤。

Swift Delegate Pattern

學習這部影片:
Swift Delegate Pattern

整理:
1
swift 的 protocol 類似 interface 、介面

2
用到Delegate Pattern 的常見地方:
tableView 的

tableView.dataSouce = self
tableView.delegate = self

collectionView 的

collectionView.dataSouce = self
collectionView.delegate = self

3
影片裡舉了一個例子,步驟:

創建一個介面 -- > Person介面有兩個方法 : 得到名字 和 得到年齡 。


然後創建一個類別 : Person類別
裡面有三個東西

一個變數 叫 delegate , 他是Person 介面創的 物件變數
(不太會形容,可能錯誤)
一個方法 叫印出名字 , 印出 delegate 的得到名字
一個方法 叫印出年齡 , 印出 delegate 的得到年齡

其實這個類別,就只是,創建一個介面變數,然後用介面變數的方法


所以 我們在ViewCotroller 就可以 先 implement interface ( protocol) 。
把 person 介面 ,先拿來implement ,接著完成
得到名字 和 得到年齡 的內容 。

之後創建一個Person類別的變數
然後 person.delegate = self

Self 就是 viewController.swift ,因為介面直接放到 viewController 類別 ,所以這樣用 ,可以直接把介面帶給 person.delegate。

所以就把 {人類介面}帶到{人類類別}了 。

4
所以在回到
tableView 的

tableView.dataSouce = self

步驟 ,也是類似 :

一 要先在 viewController.swift implement UITableViewDataSource 介面

二 完成 UITableViewDataSource介面 的 兩個 必填的方法 。

三 之後 tableView.dataSouce = self

這邊的 dataSouce 變數 就跟 Person 的delegate 變數 一樣 :
把{介面}丟給 {類別裡的一個介面變數} 。

5
觀察 原始碼 :
右鍵 -- > Jump To Definition

可以去看UITableView的源碼 ,會發現dataSource變數 :

weak open var dataSource: UITableViewDataSource?

再去看 UITableViewDataSource 源碼,會發現是一個protocol 介面 。
然後裡面有好幾個方法, 只有 兩個沒加optional,表示這兩個方法,一定要實作 。

C# Delegate

想到了 C# 的 Delegate 。
https://ithelp.ithome.com.tw/articles/10229326

再回去複習C#的Delegate:
C# Delegates explained

C#的Delegate 是真的語法 ,而不是 design pattern (程式寫法)

一開始影片講了:

Delegate 是 a pointer of function,他可以指到function ,然後讓function執行。
但不是只有這個意思, 因為我直接讓function執行不就好了 ,為何要透過Delegate指到function去執行 ?

了解Delegate的字面意思:
Delegate 的英文翻譯 :

Delegate is a representative to  communicate between two parties
Delegate 的意思 就是 代理人、中間人。

影片後來舉了一個例子 :
Delegate可以:

把一個funcion ,帶到另一個function,這才是主要用途

接著來看這篇文章:
.Net委派(delegate)的簡易解說與用法

作者大大的例子就是:
假設現在有1000個不同的人 ,要跟你借錢。
你對每個人的態度都不一樣,所以每個人都要分開處理。

所以可能會寫一個funtion長這樣:

Func 我對於借錢的反應 (amount , 人名)
{
  If A
   Return 借100
  Elseif  B
   Return 借200
  Elseif  c
  .Return 不借
  .
.
  // (1000個人 可能就有 好幾千行 的代碼)
}

所以解決方法就把每個人都當成一個funtion ,變成分開的1000個funtion ,不要集中在同一個funtion 。

變成:

Func a(int amount){
 If amount >1000
   Return 借100
 Else
  Return 借0
} 

Func b(int amount){
   Return 借200
}

Func c(int amount){
  Return 不借
}

然後
就可以創建一個delegate 物件 ,用來把這些個別判斷的function 帶到 -- >
{我對於借錢的反應}funtion 。

變成:

Func 我對於借錢的反應 (amount , delegate_function)
{
   String result =  delegate_function(amount)
   If result==不借
	   Return  "掉頭就跑"
   Else
	   Return  result
}

上一篇
取得裝置資訊
下一篇
Http、Json、Semaphores
系列文
iOS學習資源與筆記28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言